# _*_conding:cp-1252-*-
# 教育机构：银杰教育
# 讲师：李伟
# 开发时间：2025/9/10 下午11:51
"""
第二步：提取出来需要的响应字段的值 - 用jsonpath：思路如下：
1、先从excel标题读取【提取响应结果数据】这列； -- 读取出来是字符串
2、转化为字典-- json.loads()反序列化
3、分别取到这个提取表达式里的 key 和value ，key是字段名，value是jsonpath表达式。 -- 用for循环遍历
4、从接口的响应结果里使用这个jsonpath表达式提取数据。

第三步：将响应字段存储到环境变量中（键-值，可以有多组）：
1、数据读取出来后，要存起来： 全局共享给所有用例可用。
- 用类的动态属性存储提取是的数据。
  - 定义一个类 用来存储的环境变量数据
  - 是测试数据  为了规范代码分层管理，测试数据放在data里
  - 导入这个类
- 类和类的属性存环境变量的变量名和值。 ==setattr getattr
 - 数据提取出来了，设置到环境变量里  setattr, 传三个参数 ： 类/对象名，“变量名”，“值”

"""
import json

"""
import json

# 第一步：先从excel标题读取【提取响应结果数据】这列；
import json
from jsonpath import jsonpath
from data.envi_data import EnviData

# 这个是从登录接口逇resp.json()
response = {"access_token":"0efdce50-0e2f-4ed0-b4d1-944be5ab518a",
"token_type":"bearer","refresh_token":"4bfc3638-e7e4-4844-a83d-c0f8340bc146",
"expires_in":1295999,"pic":"http://mall.lemonban.com:8108/2023/09/b5a479b28d514aa59dfa55422b23a6f0.jpg",
"userId":"46189bfd628e4a738f639017f1d9225d","nickName":"lemon_auto","enabled":True}

extract_data = '{"access_token":"$..access_token","token_type":"$..token_type"}'
# 第二步：转化为字典-- json.loads()反序列化
extract_data = json.loads(extract_data)
# 第三步：分别取到这个提取表达式里的 key 和value ，key是字段名，value是jsonpath表达式
for k,v in extract_data.items(): # k是access_token,  v是"$..access_token"
    value = jsonpath(response,v)[0]  # 是响应结果对应的数据值 0efdce50-0e2f-4ed0-b4d1-944be5ab518a
    setattr(EnviData,k,value)
print(EnviData.__dict__) # 等循环结束后 查看这个类所有的属性
"""
import json
import allure
from jsonpath import jsonpath
from data.envi_data import EnviData
from loguru import logger

@allure.step("数据提起操作")
def extract_response(response,extract_data):
    if extract_data is None:
        logger.info("用例不需要数据提取！")
        return
    # 第二步：转化为字典-- json.loads()反序列化
    logger.info("------------开始数据提取----------------------")
    extract_data = json.loads(extract_data)
    logger.info(f"提取数据的表达式是：{extract_data}")
    # 第三步：分别取到这个提取表达式里的 key 和value ，key是字段名，value是jsonpath表达式
    for k,v in extract_data.items(): # k是access_token,  v是"$..access_token"
        # 对v做判断：如果是jsonpath的表达式：做jsonpath提取
        value = None
        if v.startswith("$"):
            value = jsonpath(response.json(),v)[0]  # 是响应结果对应的数据值 0efdce50-0e2f-4ed0-b4d1-944be5ab518a
        # 对v做判断：如果是text 获取text
        elif v=="text": # {"check_code":"text"}
            value = response.text  # 直接获取响应消息的文本内容
        setattr(EnviData,k,value)
    logger.info(f"提取并存储到环境变量后的类属性是：{EnviData.__dict__}") # 等循环结束后 查看这个类所有的属性



if __name__ == '__main__':
    response = {"access_token": "0efdce50-0e2f-4ed0-b4d1-944be5ab518a",
                "token_type": "bearer", "refresh_token": "4bfc3638-e7e4-4844-a83d-c0f8340bc146",
                "expires_in": 1295999,
                "pic": "http://mall.lemonban.com:8108/2023/09/b5a479b28d514aa59dfa55422b23a6f0.jpg",
                "userId": "46189bfd628e4a738f639017f1d9225d", "nickName": "lemon_auto", "enabled": True}
    extract_data = '{"access_token":"$..access_token","token_type":"$..token_type"}'
    extract_response(response,extract_data)

# 总结：
# 作用
# 从excel列中 读取【提取响应结果数据】这列 for循环遍历 得到 key 字段名， value：jsonpath表达式。
# 提取得到的数据后，存到环境变量中，便于所有测试用例使用。
